﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Management;
using IrendilDLL;
using System.Configuration;
using IrendilDLL.Database;
using System.Data;
using IrendilDLL.PageControls;
using IrendilDLL.utilities;
using AjaxControlToolkit;
using Irendil.controls;

namespace Irendil
{
    public partial class disk : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            try
            {

            // Procedo solo se é correttamente inizializzata la variabile di sessione
            String installationGUID = (String)Session["installationGUID"];
            if (installationGUID != "" || installationGUID != String.Empty)
            {
                // Recupero le informazioni relativa al nodo dell'installazione selezionato
                List<InstallationNode> installationNodeList = (List<InstallationNode>)Session["installationNodeList"];
                InstallationNode installationNodeActive = null;
                foreach (InstallationNode installationNode in installationNodeList)
                {
                    if (installationNode.GUID == installationGUID)
                        installationNodeActive = installationNode;
                }
                // Se come devo trovo il nodo attivo vado avanti
                if (installationNodeActive != null)
                {


                    if (!IsPostBack)
                    {

                        System.Web.UI.WebControls.Label labelMessageOut = (System.Web.UI.WebControls.Label)Master.Master.FindControl("LabelMessageOut");
                        labelMessageOut.Text = "Connesso a <b>" + installationNodeActive.Description+"</b>";

                        // Imposto le date di default nel filterBar
                        filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
                        filterBar.setFromDate(System.DateTime.Now);
                        filterBar.setToDate(System.DateTime.Now);

                        // Ottengo la stringa di connessione al db
                        string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
                        // Istanzio la classe di appoggio al DB Irendil
                        IrendilDbManager irendilDbManager = new IrendilDbManager(localSqlServerStr);
                        irendilDbManager.populateHostsDropDownList(filterBar.getHostDropDownList(), installationGUID);

                        // Ottengo e visualizzo gli eventi prelevati da DB
                        getAndViewDbData(filterBar, localSqlServerStr);
                    }

                    if (IsPostBack)
                    {

                    }

                    // Collego l'evento click della filterbar con il metodo di gestione evento (ripetuto in postbak)
                    ((filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar")).SearchButton.Click += new EventHandler(this.searchButton_Click);

                    // Collego l'evento click della filterbar con il metodo di gestione evento (ripetuto in postbak)
                    ((refreshBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("refreshBar")).RefreshButton.Click += new EventHandler(this.refreshButton_Click);

                }
            }

            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // In caso di sessione scaduta o altro redirigo alla pagina di login
                Response.Redirect("~//Logout.aspx");
            }
        }

        /// <summary>
        /// Metodo che preleva da DB gli eventi e li visualizza opportunamente
        /// </summary>
        /// <param name="filterBar">rif alla barra di filtraggio</param>
        /// <param name="localSqlServerStr">rif alla stringa di connessione al DB</param>
        private void getAndViewDbData(filterBar filterBar, string localSqlServerStr)
        {
            // Prelevo i dati da DB
            try
            {
                // Ottengo l'host selezionato
                String hostSelected = filterBar.getHostDropDownList().SelectedValue;

                DiskControl diskControl = new DiskControl();
                DataTable dt = diskControl.getDisksDT(hostSelected, filterBar.getFromDate(), filterBar.getToDate());

                //// Salvo i dati in cache per evitare troppi round-trip su DB
                //Cache["DataTable"] = dt;
                // Imposto la sorgente dati
                diskGridView.DataSource = dt;
                // Eseguo il bind dei dati (visualizzazione)
                diskGridView.DataBind();
                int a = diskGridView.Columns.Count;
            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Visualizzo la finestra di errore
                ((ModalPopupExtender)Master.Master.FindControl("ModalPopupExtender")).Show();

            }
        }

        /// <summary>
        /// Evento associato alla pressione del tasto search
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void searchButton_Click(object sender, EventArgs e)
        {
            // Ottengo il riferimento a filterBar
            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
            // Ottengo la stringa di connessione al db
            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
            // Ottengo e visualizzo gli eventi prelevati da DB
            getAndViewDbData(filterBar, localSqlServerStr);
        }

        /// <summary>
        /// Evento associato alla pressione del tasto refresh
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void refreshButton_Click(object sender, EventArgs e)
        {
            try
            {
                // Ottengo il riferimento alla executeBar e filterBar
                filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");

                String hostSelected = "";
                // Ottengo i valori impostati
                hostSelected = ((DropDownList)(filterBar.getHostDropDownList())).SelectedValue;

                // Istanzio la classe di controllo
                MonitorSPControl monitorSPControl = new MonitorSPControl();
                monitorSPControl.WarningThreshold = 10;
                monitorSPControl.AlertThreshold = 5;
                monitorSPControl.executeImportDiskWMI();

                // Ottengo la stringa di connessione al db
                string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
                // Aggiorno e visualizzo gli eventi prelevati da DB
                getAndViewDbData(filterBar, localSqlServerStr);
            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Visualizzo la finestra di errore
                ((ModalPopupExtender)Master.Master.FindControl("ModalPopupExtender")).Show();
            }
        }


        /// <summary>
        /// Evento associato al cambio pagina nella gridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void diskGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //// Imposto il nuovo valore di pagina
            //diskGridView.PageIndex = e.NewPageIndex;
            //// Prelevo da cache il DT
            //diskGridView.DataSource = (DataTable)Cache["DataTable"];
            //// Effetto la visualizzazione dei dati
            //diskGridView.DataBind();

            // Imposto le date di default nel filterBar
            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
            // Ottengo la stringa di connessione al db
            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
            // Ottengo e visualizzo gli eventi prelevati da DB
            getAndViewDbData(filterBar, localSqlServerStr);

            diskGridView.PageIndex = e.NewPageIndex;
            diskGridView.DataBind();
        }

        /// <summary>
        /// Evento associato all'aggiunta di una riga nella tabella
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void diskGridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {
                // Intercetto solo l'evento di scrittura riga
                if (e.Row.RowType == DataControlRowType.DataRow)
                {

                    // TRUCCO: per evitare di dovermi riferire alle colonne con Cell[x] con x intero
                    // ma con il nome della colonna (più robusto) uno una coversione ad un datarow
                    DataRow dr = ((DataRowView)e.Row.DataItem).Row;
                    
                    DiskControl diskControl = new DiskControl();
                    // Tutti questi Cast non sono molto sicuri ma si fa quel che si può TODO
                    bool isClosedDisk = diskControl.isClosedDisks(new Guid(dr["GUIDHost"].ToString()),(dr["Volume"]).ToString());
                    
                    // Imposto il colore delle righe solo per i dischi non chiusi
                    if (!isClosedDisk)
                    {
                        // ATTENZIONE NON E ROBUSTO IN CASO SI CAMBI COLONNE SU DB
                        if (dr["Status"].ToString() == " WARNING ")
                            e.Row.CssClass = "GridView_RowStyleWarning";
                        // ATTENZIONE NON E ROBUSTO IN CASO SI CAMBI COLONNE SU DB
                        if (dr["Status"].ToString() == " ALERT ")
                            e.Row.CssClass = "GridView_RowStyleAlert";
                        // ATTENZIONE NON E ROBUSTO IN CASO SI CAMBI COLONNE SU DB
                        if (dr["Status"].ToString() == " UNKNOWN ")
                            e.Row.CssClass = "GridView_RowStyleUnknown";
                    }
                }
            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Visualizzo la finestra di errore
                ((ModalPopupExtender)Master.Master.FindControl("ModalPopupExtender")).Show();
            }

        }

        }
    
}